/**
 * 优先队列:  优先排队的人 优先处理
 * 优先队列主要考虑的问题:
 *    每个元素不再只是一个数据,还包含优先级
 *    在添加元素过程中,根据优先级放入到正确的位置
 */
class Queue {
  constructor () {
    this.items = []
  }
  // 入队 将元素添加到队列中
  enqueue (item) {
    this.items.push(item)
  }
  // 出队 从队列中删除对头元素 返回删除的那个元素
  dequeue () {
    // 删除数组中的第一个元素
    return this.items.shift()
  }
  // 查看队头元素
  front () {
    return this.items[0]
  }
  // 查看队列是否为空
  isEmpty () {
    return this.items.length === 0
  }
  // 查看队列中元素的个数
  size () {
    return this.items.length
  }
  // 将队列中的元素以字符串形式返回
  toString () {
    let result = ''
    for (let item of this.items) {
      result += item + ''
    }
    return result
  }
}
// 优先队列元素类
class QueueElement {
  constructor (element, priority) {
    this.element = element
    this.priority = priority
  }
}
//优先队列类 继承queue
class priortyQueue extends Queue {
  constructor () {
    //  /调用父级构造方法
    super()
  }
  // 重写入队enqueue方法
  enqueue (element, priority) {
    //根据传入的元素 创建queueelement 对象
    const queueElement = new QueueElement(element, priority)
    if (this.isEmpty()) {
      //第一次添加 队列为空直接添加
      this.items.push(queueElement)
    } else {
      //队列中已经有元素
      let added = false // 记录是否成功添加了新元素
      for (let i = 0; i < this.items.length; i++) {
        // 让新插入的元素进行优先级比较，priority 值越小，优先级越大
        if (queueElement.priority < this.items[i].priority) {
          // 在指定的位置插入元素
          this.items.splice(i, 0, queueElement);
          added = true;
          break;
        }
      }
      // 如果遍历完所有的元素 优先级都大于新插入的元素就将新元素插到队尾
      if (!added) {
        this.items.push(queueElement)
      }
    }
  }
  // 出队 删除队列前端元素 并且返回
  dequeue () {
    return super.dequeue()
  }
  // c查看队头元素
  front () {
    return super.front()
  }
  // 检查队列是否为空
  isEmpty () {
    return super.isEmpty()
  }
  // 查看队列中的元素个数
  size () {
    return super.size()
  }
  // 重写 toString()
  toString () {
    let result = "";
    for (let item of this.items) {
      result += item.element + "-" + item.priority + " ";
    }
    return result;
  }
}
const priorityQueue = new priortyQueue()
// 入队
priorityQueue.enqueue('A', 2)
priorityQueue.enqueue('B', 20)
priorityQueue.enqueue('C', 12)
priorityQueue.enqueue('D', 8)
console.log(priorityQueue.items);
